package com.ruoyi.system.utils;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Date;

/**
 * 分表工具类
 * 用于计算消息表和用户消息表的表名
 * 
 * @author ruoyi
 */
public class ShardingTableUtils {
    
    /**
     * 获取消息表名
     * 使用H2DB时返回 t_messages
     * 使用MySQL时根据时间计算表名：t_messages_X，X = 月份-1+(年份%3)*12
     * 
     * @param dateTime 消息时间
     * @param isH2Database 是否使用H2数据库
     * @return 表名
     */
    public static String getMessagesTableName(Date dateTime, boolean isH2Database) {
        if (isH2Database) {
            return "t_messages";
        }
        
        // 转换为LocalDateTime进行计算
        LocalDateTime localDateTime = new java.sql.Timestamp(dateTime.getTime()).toLocalDateTime();
        int year = localDateTime.getYear();
        int month = localDateTime.getMonthValue();
        
        // 计算表后缀：月份-1+(年份%3)*12
        int tableSuffix = (month - 1) + (year % 3) * 12;
        
        return "t_messages_" + tableSuffix;
    }

    /**
     * 获取用户消息表名
     * 使用H2DB时返回 t_user_messages
     * 使用MySQL时根据用户ID计算表名：t_user_messages_Y，Y = |userId.hashCode()| % 128
     * 
     * @param userId 用户ID
     * @param isH2Database 是否使用H2数据库
     * @return 表名
     */
    public static String getUserMessagesTableName(String userId, boolean isH2Database) {
        if (isH2Database) {
            return "t_user_messages";
        }
        // 计算用户ID的hash值的绝对值对128取模
        int tableSuffix = Math.abs(userId.hashCode()) % 128;
        return "t_user_messages_" + tableSuffix;
    }

    /**
     * 根据年月计算消息表名
     * 
     * @param year 年份
     * @param month 月份（1-12）
     * @param isH2Database 是否使用H2数据库
     * @return 表名
     */
    public static String getMessagesTableName(int year, int month, boolean isH2Database) {
        if (isH2Database) {
            return "t_messages";
        }
        
        // 计算表后缀：月份-1+(年份%3)*12
        int tableSuffix = (month - 1) + (year % 3) * 12;
        
        return "t_messages_" + tableSuffix;
    }
}
